package com.jw.debezuim.utils;

import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;

/**
 * @version 1.0
 * @description Freemarker 工具类，默认扫描classpath下resources/templates目录文件，支持子目录
 * EXAMPLE:
 * |-resources
 * |--templates
 * |---email
 * |----test.html
 * 以上是目录结构
 * <html lang="en">
 * <body>
 * ${loginName}
 * ${realName}
 * ${orgName?default("empty")}
 * </body>
 * </html>
 * 以上是test.html文本
 * HashMap<String, String> map = new HashMap<>();
 * map.put("loginName", "foo@jw.com");
 * map.put("realName", "我是map");
 * String mapView = FreemarkerUtil.parse("email/test.html", mana);
 * ManagerInfoDto pojo = new ManagerInfoDto();
 * pojo.setLoginName("大婶");
 * pojo.setRealName("大姐");
 * String pojoView = FreemarkerUtil.parse("email/test.html", mana);
 * 以上是示例代码
 * freemark语法自行百度
 * =====================================================================================
 * 如无其他个性化配置,无需配置freemark,如有参照以下配置
 * # 是否允许HttpServletRequest属性覆盖(隐藏)控制器生成的同名模型属性。
 * spring.freemarker.allow-request-override=false
 * # 是否允许HttpSession属性覆盖(隐藏)控制器生成的同名模型属性。
 * spring.freemarker.allow-session-override=false
 * # 是否启用模板缓存。
 * spring.freemarker.cache=false
 * # 模板编码。
 * spring.freemarker.charset=UTF-8
 * # 是否检查模板位置是否存在。
 * spring.freemarker.check-template-location=true
 * # Content-Type value.
 * spring.freemarker.content-type=text/html
 * # 是否启用freemarker
 * spring.freemarker.enabled=true
 * # 设定所有request的属性在merge到模板的时候，是否要都添加到model中.
 * spring.freemarker.expose-request-attributes=false
 * # 是否在merge模板的时候，将HttpSession属性都添加到model中
 * spring.freemarker.expose-session-attributes=false
 * # 设定是否以springMacroRequestContext的形式暴露RequestContext给Spring’s macro library使用
 * spring.freemarker.expose-spring-macro-helpers=true
 * # 是否优先从文件系统加载template，以支持热加载，默认为true
 * spring.freemarker.prefer-file-system-access=true
 * # 设定模板的后缀.
 * spring.freemarker.suffix=.ftl
 * # 设定模板的加载路径，多个以逗号分隔，默认:
 * spring.freemarker.template-loader-path=classpath:/templates/
 * # 设定FreeMarker keys.
 * spring.freemarker.settings.template_update_delay=0
 * spring.freemarker.settings.default_encoding=UTF-8
 * spring.freemarker.settings.classic_compatible=true
 * =====================================================================================
 * @date 2020/10/30 11:47
 */
@Slf4j
public class FreemarkerUtil {

    /**
     * 解析本地模板文件
     *
     * @param viewName 模板文件子目录/模板名称
     * @param params   模板所需参数
     * @return
     */
    public static String parseFile(String viewName, Object params) {
        log.info("解析模板,viewName[{}],params[{}]", viewName, params);
        Configuration cfg = (Configuration) SpringBeanFactoryUtils.getBean(Configuration.class);
        String text = null;
        Template t = null;
        try {
            t = cfg.getTemplate(viewName);
            text = FreeMarkerTemplateUtils.processTemplateIntoString(t, params);
//            log.info("解析模板完成,result[{}]", text);
            log.info("解析模板完成[{}]", viewName);
        } catch (Exception e) {
            log.error("解析模板异常", e);
        }
        return text;
    }

    /**
     * 解析传入的源模板
     *
     * @param source 模板内容
     * @param params 模板所需参数
     * @return
     */
    public static String parseSource(String source, Object params) {
        log.info("解析模板,source[{}],params[{}]", source, params);
        Configuration cfg = (Configuration) SpringBeanFactoryUtils.getBean(Configuration.class);
        String text = null;
        Template t = null;
        try {
            t = new Template(null, source, cfg);
            text = FreeMarkerTemplateUtils.processTemplateIntoString(t, params);
            log.info("解析模板完成,result[{}]", text);
        } catch (Exception e) {
            log.error("解析模板异常", e);
        }
        return text;
    }

}